package com.laurent.brewerhistory.dao;

import android.content.Context;

import com.laurent.brewerhistory.common.Criteria;
import com.laurent.brewerhistory.sql.DbAdapter;

import java.util.Date;
import java.util.List;

/**
 * Classe de DAO permettant de récupérer en base
 * 
 * @author laurent
 * 
 * @param <T>
 *            Le type de données à manipuler
 */
public abstract class DAO<T> {

	/** Adapter sur la base de données */
	protected DbAdapter sqlHelper;
	
	protected String table;

	/**
	 * Constructeur
	 * 
	 */
	public DAO() {
	}

	/**
	 * Méthode de création
	 * 
	 * @param obj
	 * @return
	 */
	public abstract long create(T obj);
	/**
	 * Méthode de création ou de mise à jour si l'objet est déjà présent
	 * 
	 * @param obj
	 * @return the ID
	 */
	public abstract long saveOrUpdate(T obj);

	/**
	 * Méthode pour effacer
	 * 
	 * @param obj
	 * @return
	 */
	public abstract boolean delete(T obj);

	/**
	 * Méthode pour TOUT effacer
	 * 
	 * @param obj
	 * @return
	 */
	public abstract boolean deleteAll();

	/**
	 * Méthode de mise à jour
	 * 
	 * @param obj
	 * @return
	 */
	public abstract boolean update(T obj);

	/**
	 * Méthode de recherche des informations
	 * 
	 * @param id
	 * @return
	 */
	public abstract T find(int id);

	/**
	 * Méthode de recherche des informations filtrées par un critère
	 * 
	 * @param key the fields we want to filter
	 * @param value the value of the field
	 * @return A list of selected returns
	 */
	public abstract List<T> filteredFind(String key, Object value);

	/**
	 * Méthode de recherche des informations
	 * 
	 * @return
	 */
	public abstract List<T> findAll();
	
	/**
	 * Méthode comptage des résultats
	 * 
	 * @param crit Critères de sélection
	 * 
	 * @return Le nombre d'enregistrements
	 */
	public abstract int count(Criteria... crit);

	/**
	 * Méthode de retrouvage des résultats
	 * 
	 * @param crit Critères de sélection
	 * 
	 * @return Les enregistrements
	 */
	public abstract List<T> findByCrit(Criteria... crit);

	public abstract void synchronise(Date lastupdate, Integer userId,
			Context context);

	public abstract T findByCommonId(String commonid);
}
